In [1]:
large_us_stocks = {
    "VTI": 0.8,
    "VNQ (REIT)": 0.2
}

large_exus_stocks = {
    "EAFE": 1
}

small_us_stocks = {
    "Russell 2000": 1
}

small_exus_stocks = {
    "EAFE Small-Cap": 1
}

bonds = {
    "BND": 1
}

fund_shares = [large_us_stocks, large_exus_stocks, small_us_stocks, small_exus_stocks, bonds]

Variate portfolio by Stock/Bond ratio¶

In [2]:
from src.domain import *
from src.distribution import create_distributions_from
from src.display.distribution import display_distributions

default_distribution = SharesDistribution(
    by_type=dict(zip((ShareType.Stock, ShareType.Bond), (0.75, 0.25))),
    by_region=dict(zip((Region.US, Region.ExUS), (0.7, 0.3))),
    by_cap=dict(zip((Cap.Large, Cap.Small), (0.7, 0.3))),
    by_term=dict(zip((Term.Long, ), (1, ))),
)

def modify_distrib_by_type_ratio(distrib: SharesDistribution, stock_rate: float):
    bond_rate = 1 - stock_rate
    distrib.by_type[ShareType.Stock] = stock_rate
    distrib.by_type[ShareType.Bond] = bond_rate

distributions_rates = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]
distributions_names = [f'{round(x * 100)}/{round((1 - x) * 100)}' for x in distributions_rates]
distributions = create_distributions_from(default_distribution, modify_distrib_by_type_ratio, distributions_rates)

display_distributions(distributions, names=distributions_names, funds=fund_shares)
0/100 10/90 20/80 30/70 40/60 50/50 60/40 70/30 80/20 90/10 100/0
VTI 0.0% 3.92% 7.84% 11.76% 15.68% 19.6% 23.52% 27.44% 31.36% 35.28% 39.2%
VNQ (REIT) 0.0% 0.98% 1.96% 2.94% 3.92% 4.9% 5.88% 6.86% 7.84% 8.82% 9.8%
EAFE 0.0% 2.1% 4.2% 6.3% 8.4% 10.5% 12.6% 14.7% 16.8% 18.9% 21.0%
Russell 2000 0.0% 2.1% 4.2% 6.3% 8.4% 10.5% 12.6% 14.7% 16.8% 18.9% 21.0%
EAFE Small-Cap 0.0% 0.9% 1.8% 2.7% 3.6% 4.5% 5.4% 6.3% 7.2% 8.1% 9.0%
BND 100% 90.0% 80.0% 70.0% 60.0% 50.0% 40.0% 30.0% 20.0% 10.0% 0%
Mean ret. Std
0/100 5.12 3.69
10/90 5.66 3.71
20/80 6.17 4.31
30/70 6.67 5.28
40/60 7.14 6.46
50/50 7.60 7.76
60/40 8.02 9.12
70/30 8.43 10.53
80/20 8.81 11.96
90/10 9.16 13.41
100/0 9.49 14.87

Variate portfolio by Cap size ratio¶

In [3]:
from src.domain import *
from src.distribution import create_distributions_from
from src.display.distribution import display_distributions

default_distribution = SharesDistribution(
    by_type=dict(zip((ShareType.Stock, ShareType.Bond), (1, 0))),
    by_region=dict(zip((Region.US, Region.ExUS), (0.7, 0.3))),
    by_cap=dict(zip((Cap.Large, Cap.Small), (0.7, 0.3))),
    by_term=dict(zip((Term.Long, ), (1, ))),
)

def modify_distrib_by_cap_ratio(distrib: SharesDistribution, large_cap: float):
    small_cap = 1 - large_cap
    distrib.by_cap[Cap.Large] = large_cap
    distrib.by_cap[Cap.Small] = small_cap

distributions_rates = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]
distributions_names = [f'{round(x * 100)}/{round((1 - x) * 100)}' for x in distributions_rates]
distributions = create_distributions_from(default_distribution, modify_distrib_by_cap_ratio, distributions_rates)

display_distributions(distributions, names=distributions_names, funds=fund_shares)
0/100 10/90 20/80 30/70 40/60 50/50 60/40 70/30 80/20 90/10 100/0
VTI 0.0% 5.6% 11.2% 16.8% 22.4% 28.0% 33.6% 39.2% 44.8% 50.4% 56.0%
VNQ (REIT) 0.0% 1.4% 2.8% 4.2% 5.6% 7.0% 8.4% 9.8% 11.2% 12.6% 14.0%
EAFE 0.0% 3.0% 6.0% 9.0% 12.0% 15.0% 18.0% 21.0% 24.0% 27.0% 30.0%
Russell 2000 70.0% 63.0% 56.0% 49.0% 42.0% 35.0% 28.0% 21.0% 14.0% 7.0% 0.0%
EAFE Small-Cap 30.0% 27.0% 24.0% 21.0% 18.0% 15.0% 12.0% 9.0% 6.0% 3.0% 0.0%
BND 0% 0% 0% 0% 0% 0% 0% 0% 0% 0% 0%
Mean ret. Std
0/100 9.81 17.21
10/90 9.78 16.81
20/80 9.75 16.42
30/70 9.71 16.06
40/60 9.66 15.72
50/50 9.61 15.41
60/40 9.55 15.13
70/30 9.49 14.87
80/20 9.42 14.65
90/10 9.35 14.45
100/0 9.27 14.30